"""
AI模块模型
定义AI模型配置和处理记录相关的模型
"""

from django.db import models
from django.contrib.auth.models import User
from apps.common.models import BaseModel, TaskStatus


class AIModel(BaseModel):
    """
    AI模型配置模型
    记录可用的AI模型及其配置信息
    """
    name = models.CharField(
        max_length=100,
        unique=True,
        verbose_name="模型名称",
        help_text="AI模型的名称"
    )
    model_type = models.CharField(
        max_length=50,
        verbose_name="模型类型",
        help_text="模型类型，如GPT、BERT等"
    )
    provider = models.CharField(
        max_length=50,
        verbose_name="提供商",
        help_text="模型提供商，如OpenAI、本地等"
    )
    api_endpoint = models.URLField(
        blank=True,
        verbose_name="API端点",
        help_text="模型的API访问地址"
    )
    model_version = models.CharField(
        max_length=50,
        blank=True,
        verbose_name="模型版本",
        help_text="模型的版本号"
    )
    description = models.TextField(
        blank=True,
        verbose_name="模型描述",
        help_text="模型的详细描述"
    )
    config = models.JSONField(
        default=dict,
        verbose_name="模型配置",
        help_text="模型的配置参数"
    )
    is_enabled = models.BooleanField(
        default=True,
        verbose_name="是否启用",
        help_text="是否启用该模型"
    )
    max_tokens = models.IntegerField(
        default=4000,
        verbose_name="最大令牌数",
        help_text="模型支持的最大令牌数"
    )
    cost_per_token = models.DecimalField(
        max_digits=10,
        decimal_places=6,
        default=0.0,
        verbose_name="每令牌成本",
        help_text="每个令牌的成本"
    )

    class Meta:
        verbose_name = "AI模型"
        verbose_name_plural = "AI模型"
        db_table = "ai_model"

    def __str__(self):
        return f"{self.provider} - {self.name}"


class AITask(BaseModel):
    """
    AI处理任务模型
    记录AI处理任务的执行情况
    """
    TASK_TYPES = [
        ('extract', '信息提取'),
        ('classify', '分类'),
        ('summarize', '摘要'),
        ('translate', '翻译'),
        ('validate', '验证'),
        ('enhance', '增强'),
    ]

    ai_model = models.ForeignKey(
        AIModel,
        on_delete=models.CASCADE,
        verbose_name="AI模型",
        help_text="使用的AI模型"
    )
    task_name = models.CharField(
        max_length=200,
        verbose_name="任务名称",
        help_text="AI处理任务的名称"
    )
    task_type = models.CharField(
        max_length=20,
        choices=TASK_TYPES,
        verbose_name="任务类型",
        help_text="AI处理任务的类型"
    )
    status = models.CharField(
        max_length=20,
        choices=TaskStatus.choices,
        default=TaskStatus.PENDING,
        verbose_name="任务状态",
        help_text="当前任务的执行状态"
    )
    input_data = models.JSONField(
        verbose_name="输入数据",
        help_text="AI处理的输入数据"
    )
    output_data = models.JSONField(
        default=dict,
        verbose_name="输出数据",
        help_text="AI处理的输出结果"
    )
    prompt_template = models.TextField(
        verbose_name="提示模板",
        help_text="使用的提示词模板"
    )
    start_time = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name="开始时间",
        help_text="任务开始执行的时间"
    )
    end_time = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name="结束时间",
        help_text="任务结束的时间"
    )
    tokens_used = models.IntegerField(
        default=0,
        verbose_name="使用令牌数",
        help_text="任务消耗的令牌数量"
    )
    cost = models.DecimalField(
        max_digits=10,
        decimal_places=4,
        default=0.0,
        verbose_name="成本",
        help_text="任务的执行成本"
    )
    confidence_score = models.FloatField(
        default=0.0,
        verbose_name="置信度",
        help_text="AI处理结果的置信度"
    )
    error_message = models.TextField(
        blank=True,
        verbose_name="错误信息",
        help_text="任务执行过程中的错误信息"
    )
    metadata = models.JSONField(
        default=dict,
        verbose_name="元数据",
        help_text="任务的额外元数据"
    )
    created_by = models.ForeignKey(
        User,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name="创建者",
        help_text="创建该任务的用户"
    )

    class Meta:
        verbose_name = "AI任务"
        verbose_name_plural = "AI任务"
        db_table = "ai_task"
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.task_type} - {self.task_name}"

    @property
    def duration(self):
        """计算任务执行时长"""
        if self.start_time and self.end_time:
            return (self.end_time - self.start_time).total_seconds()
        return 0


class PromptTemplate(BaseModel):
    """
    提示词模板模型
    存储和管理AI处理使用的提示词模板
    """
    name = models.CharField(
        max_length=100,
        unique=True,
        verbose_name="模板名称",
        help_text="提示词模板的名称"
    )
    task_type = models.CharField(
        max_length=20,
        choices=AITask.TASK_TYPES,
        verbose_name="任务类型",
        help_text="适用的任务类型"
    )
    template_content = models.TextField(
        verbose_name="模板内容",
        help_text="提示词模板的内容"
    )
    variables = models.JSONField(
        default=list,
        verbose_name="变量列表",
        help_text="模板中使用的变量列表"
    )
    description = models.TextField(
        blank=True,
        verbose_name="模板描述",
        help_text="模板的用途和说明"
    )
    version = models.CharField(
        max_length=20,
        default="1.0",
        verbose_name="版本号",
        help_text="模板的版本号"
    )
    is_default = models.BooleanField(
        default=False,
        verbose_name="是否默认",
        help_text="是否为该任务类型的默认模板"
    )
    usage_count = models.IntegerField(
        default=0,
        verbose_name="使用次数",
        help_text="模板被使用的次数"
    )
    success_rate = models.FloatField(
        default=0.0,
        verbose_name="成功率",
        help_text="使用该模板的任务成功率"
    )

    class Meta:
        verbose_name = "提示词模板"
        verbose_name_plural = "提示词模板"
        db_table = "ai_prompt_template"
        unique_together = ['task_type', 'name']

    def __str__(self):
        return f"{self.task_type} - {self.name}"


class AIProcessingLog(BaseModel):
    """
    AI处理日志模型
    记录AI处理的详细日志信息
    """
    ai_task = models.ForeignKey(
        AITask,
        on_delete=models.CASCADE,
        verbose_name="AI任务",
        help_text="关联的AI任务"
    )
    log_level = models.CharField(
        max_length=20,
        choices=[
            ('DEBUG', 'Debug'),
            ('INFO', 'Info'),
            ('WARNING', 'Warning'),
            ('ERROR', 'Error'),
        ],
        default='INFO',
        verbose_name="日志级别",
        help_text="日志的级别"
    )
    message = models.TextField(
        verbose_name="日志消息",
        help_text="日志的详细消息"
    )
    step = models.CharField(
        max_length=100,
        blank=True,
        verbose_name="处理步骤",
        help_text="当前处理的步骤"
    )
    data_snapshot = models.JSONField(
        default=dict,
        verbose_name="数据快照",
        help_text="当前步骤的数据快照"
    )

    class Meta:
        verbose_name = "AI处理日志"
        verbose_name_plural = "AI处理日志"
        db_table = "ai_processing_log"
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.log_level} - {self.message[:50]}"
